package com.day5.test9_polymorpic;

/**
 * @author 小坡
 * @date 2022/9/7  16:53
 **/
public class TestPolymorpic {
    /*
      多态的好处和弊端
    * 多态的好处︰提高了程序的扩展性
    * 具体体现︰定义方法的时候，使用父类型作为参数，该方法就可以接收这父类的任意子类对象
    * 多态的弊端︰不能使用子类的特有功能
    * */
    public static void main(String[] args) {
//        Dog dog=new Dog();
//        useDog(dog);
//        优化如下
        useAnimal(new Dog());
        useAnimal(new Cat());
    }

    /*   public static void useDog(Dog dog) {
           dog.eat();
       }
       public static void useCat(Cat cat) {
           cat.eat();
       }
       优化这两个方法
       */
    public static void useAnimal(Animal animal) {
        animal.eat();
//        Dog dog = (Dog) animal;
//        dog.watchHome();  //  错误 ：ClassCastException 类型转换异常错误
//        代码逻辑会出现错误   优化如下
//        instanceof 关键字  使用格式：  变量名 instanceof  类型
//        通俗的理解：判断关键字左边的变量，是否是右边的类型，返回Boolean类型的结果  进行判断的作用
        if (animal instanceof Dog) {   //   判断这是不是Dog 的类型
            Dog dog = (Dog) animal;
            dog.watchHome();  //  错误 ：ClassCastException 类型转换异常错误
        }
    }
}

abstract class Animal {
    public abstract void eat();
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }

    public void watchHome() {
        System.out.println("看家");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}